home *** CD-ROM | disk | FTP | other *** search
- **
- ** termMisc.asm
- **
- ** Miscellaneous assembly language routines.
- **
- ** Copyright © 1990-1994 by Olaf `Olsen' Barthel
- ** All Rights Reserved
- **
-
- include "exec/types.i"
- include "exec/tasks.i"
- include "exec/execbase.i"
-
- *--------------------------------------------------------------------------
-
- CALL macro
- xref _LVO\1
- jsr _LVO\1(a6)
- endm
-
- *--------------------------------------------------------------------------
-
- csect text,0,0,1,2
-
- *--------------------------------------------------------------------------
-
- xdef _SPrintf
- xdef _VSPrintf
-
- xdef _Atol
- xdef _StackReport
-
- *--------------------------------------------------------------------------
-
- _SPrintf:
-
- movem.l a2/a3/a6,-(sp) ; Save registers
-
- move.l 4+12(sp),a3 ; Get destination buffer
- move.l 8+12(sp),a0 ; Get format string
- lea 12+12(sp),a1 ; Get arguments
- lea stuffchar(pc),a2 ; Get formatting routine
-
- move.l _SysBase(a4),a6 ; Get ExecBase
- CALL RawDoFmt ; Format the string
-
- movem.l (sp)+,a2/a3/a6 ; Restore registers
-
- rts
-
- *--------------------------------------------------------------------------
-
- _VSPrintf:
-
- movem.l a2/a3/a6,-(sp)
-
- move.l 4+12(sp),a3
- move.l 8+12(sp),a0
- move.l 12+12(sp),a1
- lea stuffchar(pc),a2
-
- move.l _SysBase(a4),a6
- CALL RawDoFmt
-
- movem.l (sp)+,a2/a3/a6
-
- rts
-
- stuffchar:
-
- move.b d0,(a3)+
- rts
-
- *--------------------------------------------------------------------------
- *
- * A tiny replacement for Atol(), implemented through StrToLong.
- *
- *--------------------------------------------------------------------------
-
- _Atol: move.l a0,d1 ; Save argument
-
- movem.l d2/a6,-(sp) ; Save registers
-
- pea.l 0 ; Push a zero on the stack
-
- lea.l (sp),a0 ; Get a pointer to the value
- move.l a0,d2 ; Get it into a convenient register
-
- move.l _DOSBase(a4),a6 ; Get DOSBase
-
- CALL StrToLong ; Convert the string
- tst.l d0
-
- bgt.b 1$ ; Did we get anything sensible?
-
- addq #4,sp ; Fix the stack
- moveq #0,d0 ; Clear the result
-
- movem.l (sp)+,d2/a6 ; Restore registers
- rts
-
- 1$ move.l (sp)+,d0 ; Get the conversion result
-
- movem.l (sp)+,d2/a6 ; Restore registers
- rts
-
- *--------------------------------------------------------------------------
- *
- * A routine to return the amount of stack space currently
- * in use. Quite useful for debugging purposes.
- *
- *--------------------------------------------------------------------------
-
- _StackReport:
-
- move.l a6,-(sp) ; Save library base
-
- move.l _SysBase(a4),a6 ; Get SysBase
- move.l ThisTask(a6),a0 ; We want to check ourselves
-
- move.l TC_SPUPPER(a0),d0 ; Get the stack upper limit
- sub.l sp,d0 ; Subtract the current stack pointer
- subq #8,d0 ; Don't forget the remaining junk
-
- move.l (sp)+,a6 ; Restore library base
- rts
-
- *--------------------------------------------------------------------------
- *
- * These two lines are actually to make SLINK believe that some kind
- * of startup code will clear the Data/BSS segment before running the
- * main program. Since this is no longer necessary with Kickstart 2.x
- * these two lines will save quite some disk space.
- *
- *--------------------------------------------------------------------------
-
- lea __BSSBAS,a0
- move.l #__BSSLEN,d0
-
- *--------------------------------------------------------------------------
-
- csect __MERGED
-
- xref _DOSBase
- xref _SysBase
-
- xref __BSSBAS
- xref __BSSLEN
-
- end
-